iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0

Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~

在本系列文會展開使用 Avalonia UI 技術所建立的 TopAOAIConnector App 。由於使用 Avalonia UI 可以很快速的進行各平台的 桌面 應用程式開發,並且透過此 TopAOAIConnector App 來串接 Azure OpenAI Service 時所需的功能研究。

本篇是 就是要來點 A.I. 的 TopAOAIConnector App 系列文的 EP28。


EP 27 當中有提到關於第二點問題:
04

當附加檔案的文字內容頗多時,看起來就會有點顯得弔詭,雖然在該回有處理了一種方式:如果內容太長就中略,留下開頭與結尾的一部份文字顯示出來。
06-1

但可能稍嫌不夠好,本回來介紹一下另一種處理概念。


其處理的方式是把附加文字檔案的內容不要附加上來呈現,改用一個圖示來代替;但其內文還是要加入到要丟給 AOAI 的 Chat,這樣才能保持正常的對話過程。

大概是呈現如此的感覺:

01

02

要完成這樣的設計,其實本身也仰賴 Avalonia UI 的 Library 在設計 TextBlock 時所使用的 InlineUIContainer 設計囉!

來看看吧~~~

首先找到 ViewModels/ChatPageViewModel.cs 的 ChatPageViewModel 類別,幫其設計增加兩個欄位。

private string fileName = string.Empty;
private string fileContent = string.Empty;

完成如下圖紅框:
03-1

再次找到 ChatPageViewModel 類別當中的 Attach 方法,在讀取文字檔後設定上述兩欄位的資料。

fileName = resultFiles[0].Name;
fileContent = await reader.ReadToEndAsync();

完成如下圖紅框:
03-2

再繼續於此 ChatPageViewModel 類別設計一個 RelayCommand 的 BuildInline 方法。

[RelayCommand]
private void BuildInline(Control control)
{
    System.Diagnostics.Debug.WriteLine("BuildInline...");

    if (control is not null && control is SelectableTextBlock selectableTextBlock)
    {
        selectableTextBlock.Text = string.Empty;
        selectableTextBlock.Inlines?.Clear();

        int index = ChatText.IndexOf(fileContent);

        selectableTextBlock.Inlines?.Add(new Run(ChatText[..index]));

        var fileStackPanel = new StackPanel()
        {
            Children =
            {
                new SymbolIcon() { FontSize = 60, Symbol = FluentIcons.Common.Symbol.Document, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left},
                new TextBlock() { FontSize = 20, Text = fileName }
            }
        };

        selectableTextBlock.Inlines?.Add(fileStackPanel);
        selectableTextBlock.Inlines?.Add(new Run(ChatText[(index + fileContent.Length)..]));
    }
}

完成如下圖紅框:
03-3

找到 ViewModels/ChatPageView.axmal 的 SelectableTextBlock 把原本的設計從:

<SelectableTextBlock Name="mainChatText" Margin="0,4" FontSize="20" Text="{Binding ChatText}" TextWrapping="WrapWithOverflow" />

替換成:

<SelectableTextBlock Name="mainChatText" Margin="0,4" FontSize="20" TextWrapping="WrapWithOverflow">
    Welcome to TopAOAIConnector!
    <LineBreak />
    <Interaction.Behaviors>
        <ValueChangedTriggerBehavior Binding="{Binding ChatText}">
            <InvokeCommandAction Command="{Binding BuildInlineCommand}" CommandParameter="{Binding #mainChatText}" />
        </ValueChangedTriggerBehavior>
    </Interaction.Behaviors>
</SelectableTextBlock>

完成如下圖紅框:
04

偵錯執行(F5)的結果如下:

首先,先把新聞內容附檔附上。
05-1

再輸入提問 "請將上述新聞內容總結至 40 字內。" 後,點選 "送出"。
05-2

此時會看到 AOAI 的 "回應"。
05-3

再輸入提問 "新聞內容提及的電費每度電為多少元。" 後,點選 "送出"。
05-4

看到 AOAI 的 "回應"。
05-5

再輸入提問 "新聞內容當中所提到的人物名稱為那些?" 後,點選 "送出"。
05-6

此時會看到 AOAI 的 "回應"。
05-7

大體上完成附檔文字不再出現在 UI 的內容顯示當中,改用圖示顯示,但與 AOAI 對談效果仍是順利完成。

完成!!!


上一篇
EP 27
下一篇
EP 29
系列文
就是要來點 A.I. 的 TopAOAIConnector App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言